package com.joyoung.sdk.resolve;

import android.content.Context;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;


public class JxXML {
	private Context context;
	
	public JxXML(Context context) {
		super();
		this.context=context;
	}
	
	/**
	 * 该方法读取的是明文配置文件
	 *
	 * @param name 配置文件的路径+文件名
	 * @return LinkedHashMap  返回配置文件的键值对
     * @throws IOException
     * @throws DocumentException
	 */
    public  LinkedHashMap readFromAssets(String name) throws IOException, DocumentException {
        InputStream is = context.getResources().getAssets().open(name);
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        byte[] data = new byte[1024];
        int current = 0;

        while((current = bis.read(data,0,data.length)) != -1){
            buffer.write(data,0,current);
        }
        String res = new String(buffer.toByteArray());
        return xml2map(res.trim());
    }



	private LinkedHashMap xml2map(String xmlString) throws DocumentException {
		Document doc = DocumentHelper.parseText(xmlString);
		Element rootElement = doc.getRootElement();
		LinkedHashMap<String,String> map = new LinkedHashMap();
		ele2map(map, rootElement);
		return map;
		}
	
    /***
     * 核心方法，递归调用
     *
     * @param map
     * @param ele
     */
    private void ele2map(LinkedHashMap map, Element ele) {
     // 获得当前节点的子节点
     List<Element> elements = ele.elements();
     if (elements.size() == 0) {
      // 没有子节点说明当前节点是叶子节点，直接取值即可
      map.put(ele.getName(), ele.getText());
     } else if (elements.size() == 1) {
      // 只有一个子节点说明不用考虑list的情况，直接继续递归即可
         LinkedHashMap tempMap=new LinkedHashMap();
      ele2map(tempMap, elements.get(0));
      map.put(ele.getName(), tempMap);
     } else {
      // 多个子节点的话就得考虑list的情况了，比如多个子节点有节点名称相同的
      // 构造一个map用来去重
         LinkedHashMap<String, Object> tempMap = new LinkedHashMap<String, Object>();
      for (Element element : elements) {
       tempMap.put(element.getName(), null);
      }
      Set<String> keySet = tempMap.keySet();
      for (String string : keySet) {
       Namespace namespace = elements.get(0).getNamespace();
       List<Element> elements2 = ele.elements(new QName(string,namespace));
       // 如果同名的数目大于1则表示要构建list
       if (elements2.size() > 1) {
        List<LinkedHashMap> list = new ArrayList<LinkedHashMap>();
        for (Element element : elements2) {
            LinkedHashMap tempMap1=new LinkedHashMap();
         ele2map(tempMap1, element);
         list.add(tempMap1);
        }
        map.put(string, list);
       } else {
        // 同名的数量不大于1则直接递归去
           LinkedHashMap tempMap1=new LinkedHashMap();
        ele2map(tempMap1, elements2.get(0));
        map.put(string, tempMap1);
       }
      }
     }
    }
}